const isChinese = (s) => {
  var pattern1 = /^[\u4E00-\u9FBF]+$/
  var pattern2 = /^[\u3400-\u4DBF]+$/
  var pattern3 = /^[\ue815-\ue864]+$/
  return pattern1.test(s) || (pattern2.test(s) || pattern3.test(s))
}

/*********************************************
 * 功能:获取字符串长度（汉字占两个字符）
 * 参数:无
 * 返回:
 **********************************************/

const nameLen = (s) => {
  var l = 0
  var a = s.split("")
  for (var i = 0; i < a.length; i++) {
    if (a[i].charCodeAt(0) < 299) {
      l++
    } else {
      l += 2
    }
  }
  return l
}

// 检测中文字符个数
const calCStrNum = (str) => {
  var reg = /[\u4e00-\u9fa5]/g  //测试中文字符的正则
  if (reg.test(str))        //使用正则判断是否存在中文
    return str.match(reg).length //返回中文的个数
  else
    return 0
}

// 检测英文字符个数
const calEStrNum = (str) => {
  var reg = /[A-Z]/g  //测试大写英文字符的正则
  if (reg.test(str))
    return str.match(reg).length
  else
    return 0
}

//计算中英文字符的长度
const calStrLen = (value) => {
  if (!value) return 0
  return value.length + calCStrNum(value)
}

/**
 * check函数规范:通过则返回false,未通过则返回错误消息
 */
const checker = {
  checkNameAppoint(val) {
    var reg = /^[A-Za-z]+$/
    var msg = false
    if (val.length < 1) {
      msg = '称呼不能为空'
    }
    else if (val.length > 38) {
      msg = '称呼长度不能大于38位字符'
    }
    else if (!isChinese(val) && !reg.test(val)) {
      msg = '称呼只能为中文或者英文'
    }
    return msg
  },

  checkNameBeneficiary: (value) => {
    var reg_health = /^([\u4e00-\u9fa5]{1,38}|[A-Z]{1,38}|[.·．\s])+$/
    var trimVal = value.trim()
    if (trimVal === '') {
      return '姓名不能为空！'
    }
    if (nameLen(trimVal) > 38) {
      return '姓名的长度不能超过19个汉字，英文不能超过38个！'
    }

    var tempValue = trimVal.replace(/\s+/g, "")
    if (tempValue === '不详' || tempValue === '不祥' || tempValue === '未知' || tempValue === '不知道') {
      return '姓名格式不符合规范'
    }

    var tempTips = '姓名至少要有2个汉字或4个英文字母且只允许输入汉字、大写英文字母、半角点号"."、全角点号"·"及"．"'
    if (reg_health.test(trimVal)) {
      if (!(calCStrNum(trimVal) >= 2 || calEStrNum(trimVal) >= 4)) {
        return tempTips
      }
      else {
        return false
      }
    }
    return tempTips
  },

  checkIdNo: (idcard) => {
    var errorCode = ["验证通过!",
      "身份证号码输入错误，请重新输入",
      "身份证号码出生日期超出范围或含有非法字符!",
      "身份证号码输入错误，请重新输入",
      "身份证号码不能为空"]
    var area = {
      11: "北京",
      12: "天津",
      13: "河北",
      14: "山西",
      15: "内蒙古",
      21: "辽宁",
      22: "吉林",
      23: "黑龙江",
      31: "上海",
      32: "江苏",
      33: "浙江",
      34: "安徽",
      35: "福建",
      36: "江西",
      37: "山东",
      41: "河南",
      42: "湖北",
      43: "湖南",
      44: "广东",
      45: "广西",
      46: "海南",
      50: "重庆",
      51: "四川",
      52: "贵州",
      53: "云南",
      54: "西藏",
      61: "陕西",
      62: "甘肃",
      63: "青海",
      64: "宁夏",
      65: "新疆",
      71: "台湾",
      81: "香港",
      82: "澳门",
      91: "国外"
    }
    var idcard, Y, JYM
    var S, M
    var idcard_array = new Array()
    idcard_array = idcard.split("")
    //校验为空
    if (!idcard) {
      return errorCode[4]
    }
    // 地区检验
    if (area[parseInt(idcard.substr(0, 2), 10)] == null) {
      return errorCode[3]
    }

    // 身份号码位数及格式检验
    switch (idcard.length) {
      case 15:
        var ereg
        if ((parseInt(idcard.substr(6, 2), 10) + 1900) % 4 == 0
          || ((parseInt(idcard.substr(6, 2, 10)) + 1900) % 100 == 0 && (parseInt(idcard
            .substr(6, 2), 10) + 1900) % 4 == 0)) {
          ereg = /^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$/// 测试出生日期的合法性
        } else {
          ereg = /^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$/// 测试出生日期的合法性
        }
        if (ereg.test(idcard)) {
          return false
        } else {
          return errorCode[2]
        }
        break
      case 18:
        // 18位身份号码检测
        // 出生日期的合法性检查
        // 闰年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))
        // 平年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))
        var ereg
        if (parseInt(idcard.substr(6, 4), 10) % 4 == 0
          || (parseInt(idcard.substr(6, 4), 10) % 100 == 0 && parseInt(idcard
            .substr(6, 4), 10) % 4 == 0)) {
          ereg = /^[1-9][0-9]{5}(19|[2-9][0-9])[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$/// 闰年出生日期的合法性正则表达式
        } else {
          ereg = /^[1-9][0-9]{5}(19|[2-9][0-9])[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$/// 平年出生日期的合法性正则表达式
        }
        if (ereg.test(idcard)) {// 测试出生日期的合法性
          // 计算校验位
          S = (parseInt(idcard_array[0], 10) + parseInt(idcard_array[10], 10))
            * 7
            + (parseInt(idcard_array[1], 10) + parseInt(idcard_array[11], 10))
            * 9
            + (parseInt(idcard_array[2], 10) + parseInt(idcard_array[12], 10))
            * 10
            + (parseInt(idcard_array[3], 10) + parseInt(idcard_array[13], 10))
            * 5
            + (parseInt(idcard_array[4], 10) + parseInt(idcard_array[14], 10))
            * 8
            + (parseInt(idcard_array[5], 10) + parseInt(idcard_array[15], 10))
            * 4
            + (parseInt(idcard_array[6], 10) + parseInt(idcard_array[16], 10))
            * 2 + parseInt(idcard_array[7], 10) * 1
            + parseInt(idcard_array[8], 10) * 6
            + parseInt(idcard_array[9], 10) * 3
          Y = S % 11
          M = "F"
          JYM = "10X98765432"
          M = JYM.substr(Y, 1)// 判断校验位
          if (M == idcard_array[17]) {
            return false // 检测ID的校验位
          } else {
            return errorCode[3]
          }
        } else {
          return errorCode[2]
        }
        break
      default:
        return errorCode[1]
        break
    }
  },

  checkPhone: (value) => {
    if (!value) return true
    return !(/^(\+\d{2}-)?(13|14|15|17|18)\d{1}\-?\d{5}(\d{3}|\*{3})$/.test(value.trim()))
  },

  //邮件地址字符
  checkEmail: (value) => {
    if (!value) return true
    return !(/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/.test(value.trim()))
  },

  calStrLen: (value) => {
    if (!value) return 0
    return value.length + calCStrNum(value)
  },

  isEmpty: (val, msg) => {
    if (val === 0 || val === '0') {
      return false
    }
    return val ? 0 : msg
  },
  //护照
  checkPassport: (val) => {
    var reg = /^[A-Za-z0-9]+$/
    var msg = false
    if (val.length < 1) {
      msg = '护照不能为空'
    }
    else if (val.length < 3) {
      msg = '护照长度不能小于3位字符'
    }
    else if (val.length > 30) {
      msg = '护照长度不能大于30位字符'
    }
    else if (!reg.test(val)) {
      msg = '护照只能输入字母和数字'
    }
    return msg
  },
  //军人证
  checkMilitaryCard: (val) => {
    //军人证 10-18 包含'字第' 字母、数字、汉字
    var reg = /^[\u4E00-\u9FA5a-zA-Z0-9]+$/
    var msg = false
    var valLen = calStrLen(val)
    if (valLen < 1) {
      msg = '军人证不能为空'
    }
    else if (val.indexOf('字第') === -1) {
      msg = `军人证必须包含'字第'`
    }
    else if (valLen < 10 || valLen > 18) {
      msg = '港澳台证长度必须在10位~18位字符之间'
    }
    else if (!reg.test(val)) {
      msg = '军人证只能输入字母、数字、中文'
    }
    return msg
  },
  //港澳台证件
  checkGangAoCard: (val) => {
    //港澳台证件 8-30 字母、数字、汉字
    var msg = false
    var valLen = calStrLen(val)
    if (valLen < 1) {
      msg = '港澳台证不能为空'
    }
    else if (valLen < 8 || valLen > 30) {
      msg = '港澳台证长度必须在8位~30位字符之间'
    }
    else if (!/^[\u4E00-\u9FA5a-zA-Z0-9]+$/.test(val)) {
      msg = '港澳台证只能输入字母、数字、中文'
    }
    return msg
  },
  // 出生证
  checkBornCard: (val) => {
    //出生证 10 数字、字母 10位，首位为大写字符
    var reg = /^[A-Z]{1}[A-Za-z0-9]{9}$/
    var msg = false
    if (!val) {
      msg = '出生证不能为空'
    }
    else if (!reg.test(val)) {
      msg = '出生证只能输入字母、数字，且字符长度为10'
    }
    return msg
  }
}

export default checker